package com.pingan.haofang.searchcloud.api.query.parser.dbobject.util;

import java.util.List;

import com.pingan.haofang.searchcloud.api.query.parser.dbobject.SqlNode;
import com.pingan.haofang.searchcloud.api.query.parser.dbobject.SqlNodeType;
import com.pingan.haofang.searchcloud.api.query.parser.dbobject.sqlnode.JdbcParamNode;
import com.pingan.haofang.searchcloud.api.query.parser.dbobject.sqlnode.TextNode;

/**
 * ClassName: SqlNodeUtil <br>
 * Function: SQL节点工具类
 *
 * @author luyi04
 * @version 1.0.0
 * @since 1.0.0
 * @date 20150724
 */
public class SqlNodeUtil {

    /**
     * 是否为column节点
     * 
     * @param node
     * @return
     */
    public static boolean isColumn(SqlNode node) {
        return is(node, SqlNodeType.COLUMN);
    }

    /**
     * 判断节点是否属于某一类型
     * 
     * @param node
     * @param nodeType
     * @return
     */
    public static boolean is(SqlNode node, int nodeType) {
        return node.getType() == nodeType;
    }

    /**
     * 判断是否包含字段
     * 
     * @param node
     * @return
     */
    public static boolean containColumn(SqlNode node) {
        return contain(node, SqlNodeType.COLUMN);
    }

    /**
     * 判断是否包含字段
     * 
     * @param nodeList
     * @return
     */
    public static boolean containColumn(List<SqlNode> nodeList) {
        for (SqlNode node : nodeList) {
            if (contain(node, SqlNodeType.COLUMN)) {
                return true;
            }
        }
        return false;
    }

    /**
     * 判断是否包含某一类型的节点
     * 
     * @param node
     * @param nodeType
     * @return
     */
    public static boolean contain(SqlNode node, int nodeType) {
        return (node.getType() & nodeType) == 1;
    }

    /**
     * 判断是否为常量
     * 
     * @param node
     * @return
     */
    public static boolean isConstant(SqlNode node) {
        return node.getType() == SqlNodeType.TEXT;
    }

    /**
     * SQL节点克隆
     * 
     * @param source
     * @return
     */
    public static SqlNode clone(SqlNode source) {
        switch (source.getType()) {
            case SqlNodeType.TEXT:
                return new TextNode(((TextNode) source).getValue());
            case SqlNodeType.JDBC_PARAM:
                return new JdbcParamNode(((JdbcParamNode) source).getJdbcParamIndex());
            default:
                throw new RuntimeException("");
        }
    }

}
